package com.ushine.web.component.task.exector;

import com.ushine.web.component.exception.ServiceException;
import com.ushine.web.component.exception.ServiceExceptionEnum;
import com.ushine.web.component.task.AsyncConstant;
import com.ushine.web.component.task.handler.AsyncTaskConstructor;
import com.ushine.web.component.task.model.AsyncTaskInfoDO;
import lombok.extern.slf4j.Slf4j;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Component;

/**
 * @Author: yls
 * @Date: 2021/04/28 23:01
 * @Description: 系统默认的任务执行器
 * @Version 1.0
 */
@Component
@Slf4j
public class AsyncDefaultTaskExecutor {

    /**
     * 功能描述:
     * 〈 默认走的系统执行器 〉
     *
     * @param taskInfo             任务信息
     * @param asyncTaskConstructor 执行器构造器
     * @return : void
     * @author : yls
     * @date : 2022/02/27 12:17
     */
    @Async
    public void executor(AsyncTaskInfoDO taskInfo, AsyncTaskConstructor asyncTaskConstructor) throws ServiceException {
        executorRun(taskInfo, asyncTaskConstructor);
    }


    /**
     * 功能描述:
     * 〈 系统业务任务执行器 〉
     *
     * @param taskInfo             任务信息
     * @param asyncTaskConstructor 执行器构造器
     * @return : void
     * @author : yls
     * @date : 2022/02/27 12:17
     */
    @Async(value = AsyncConstant.BUSINESS_EXECUTOR)
    public void executorBusiness(AsyncTaskInfoDO taskInfo, AsyncTaskConstructor asyncTaskConstructor) throws ServiceException {
        executorRun(taskInfo, asyncTaskConstructor);
    }

    /**
     * 功能描述:
     * 〈 系统导出任务执行器 〉
     *
     * @param taskInfo             任务信息
     * @param asyncTaskConstructor 执行器构造器
     * @return : void
     * @author : yls
     * @date : 2022/02/27 12:17
     */
    @Async(value = AsyncConstant.EXPORT_EXECUTOR)
    public void executorExport(AsyncTaskInfoDO taskInfo, AsyncTaskConstructor asyncTaskConstructor) throws ServiceException {
        executorRun(taskInfo, asyncTaskConstructor);
    }


    /**
     * 功能描述:
     * 〈 系统导入任务执行器 〉
     *
     * @param taskInfo             任务信息
     * @param asyncTaskConstructor 执行器构造器
     * @return : void
     * @author : yls
     * @date : 2022/02/27 12:17
     */
    @Async(value = AsyncConstant.IMPORT_EXECUTOR)
    public void executorImport(AsyncTaskInfoDO taskInfo, AsyncTaskConstructor asyncTaskConstructor) throws ServiceException {
        executorRun(taskInfo, asyncTaskConstructor);
    }

    /**
     * 功能描述:
     * 〈 具体的执行流程 〉
     *
     * @param taskInfo             任务信息
     * @param asyncTaskConstructor 异步任务构造器
     * @return : void
     * @author : yls
     * @date : 2022/02/27 12:09
     */
    private void executorRun(AsyncTaskInfoDO taskInfo, AsyncTaskConstructor asyncTaskConstructor) throws ServiceException {
        try {
            asyncTaskConstructor.init();
            asyncTaskConstructor.asyncRunnable();
        } catch (Exception e) {
            asyncTaskConstructor.exception(e);
            // 终止当前线程
            Thread.currentThread().interrupt();
            throw new ServiceException(ServiceExceptionEnum.ASYNC_TASK_ERROR, e);
        } finally {
            asyncTaskConstructor.releaseResource();
        }
        asyncTaskConstructor.finish();
    }
}
